import axios from 'axios';
import router from '../router';
import {ElMessage} from 'element-plus'

export default function (options) {
    // 添加基础URL前缀
    if (!options.url.startsWith('http')) {
        let url = options.url;
        // 如果URL以 / 开头，去掉开头的 /
        if (url.startsWith('/')) {
            url = url.substring(1);
        }
        options.url = 'http://localhost:8080/' + url;
    }

    // 配置每次发送请求都从localStorage中获取名字叫token的数据,
    // 添加到请求头部的Authorization属性中
    // Object.assign用于合并对象的数据
    //const tk = localStorage.getItem('token') || ''
    //options.headers = Object.assign({}, options.headers, { token: tk })
    const token = localStorage.getItem('token');
    console.log('发送请求前的token:', token);
    // 只在token不为null且不为空字符串时才添加到请求头
    if (token && token !== 'null' && token !== 'undefined') {
        options.headers = Object.assign(
            {token: token},
            options.headers || {}
        );
    } else {
        options.headers = options.headers || {};
    }
    // axios() 返回一个promise对象，用于异步请求
    // options是一个对象，其中包含了许多用于配置请求的参数，
    // 例如请求的url、请求方法（GET、POST等）、请求头等
    return axios(options)
        .then(({status, data}) => {
            // 该函数在请求成功并返回数据时被调用
            // status：HTTP状态码，例如200表示请求成功。
            // data：服务器返回的数据。
            // statusText：HTTP状态文本，例如"OK"表示请求成功。
            if (status == 200) {
                console.log(data);
                return data;
            } else {
                ElMessage.error('访问服务器出现异常')
                throw new Error('访问服务器出现异常');
            }
        })
        .then((responseData) => {
            // 确保 responseData 存在
            if (!responseData) {
                throw new Error('服务器未返回有效数据');
            }

            const {code, data, msg} = responseData;
            switch (code) {
                case 200:
                    if (msg)
                        ElMessage({
                            message: msg,
                            type: 'success',
                        })
                    return data;
                case 401:
                    ElMessage({
                        message: msg || '认证失败,稍后跳转到登录页面',
                        type: 'warning',
                    })
                    setTimeout(function(){
                        localStorage.removeItem('token');
                        router.push("/login");
                    },1800);
                    throw new Error('认证失败');
                    break;
                default:
                    if(msg){
                        ElMessage(msg);
                    }
                    throw new Error(msg || '请求失败');
            }
        }).catch(e => {
            // 不要吞掉错误，重新抛出以便调用方处理
            if (!(e.message === '认证失败')) {
                console.error('请求错误:', e);
                //ElMessage.error('系统出现异常,请联系管理员');
            }
            throw e;
        });
}